# -*- coding: utf-8 -*-
# @Project : gate-v541-auto-test
# @File    : commandTask.py
# @Author  : 朱宽
# @Time    : 2021/8/26 15:57
# @Software: Win10 / Python3 / Pycharm
from src.public.v541Public import v541Public
from src.utils.HttpCommonRequest import HttpRequests
from tomorrow import threads
import time


class commandTask():
    '''
        这个类主要实现 多线程异步处理事务的功能；
        （1）功能1：模拟终端设备
        （2）功能2：模拟saas平台调用api接口给终端设备下发指令

        如有不明，请看本人语雀：https://www.yuque.com/u2275529/pk4vt1/wo0mda
    '''

    def __init__(self):
        '''
            定义了类内的私有公共属性
        '''
        self.__flag = False  # 设置一个类内私有的全局属性

    @threads(3, timeout=60)
    def eqTask(self, eq_dict):
        '''
        模拟设备；使用threads修饰，是为了实现多线程异步功能
        :param eq_dict: {}，字典形式，传入模拟设备需要的参数
        :return: 返回结果，str型数据，终端接收的数据
        '''
        v541_public=v541Public()
        v541_public.v541_authentication(eq_dict['tcp_class'],eq_dict['client'],eq_dict['file_name']) #鉴权
        v541_public.v541_hb(eq_dict['tcp_class'],eq_dict['client'],eq_dict['file_name'])#心跳

        self.__flag=True #修改公共参数为True，告诉API线程 设备已经上线，可以下发指令了
        
        api_send=eq_dict['tcp_class'].receive(client=eq_dict['client'], eol='7e', timeout=10)
        if str(api_send)!='timed out':
            api_send=v541_public.unescape(hex_str=str(api_send))
        print('终端收的下发的指令数据包为：',str(api_send))

        if str(api_send)!='timed out':
            eq_send_unescape=v541_public.unescape(eq_dict['data']['SendData'])
            api_send_unescape = v541_public.unescape(api_send)  # 对服务器发给终端的内容进行反转义
            if eq_dict['data']['TestCaseFlag']=='command8103':
                eq_mes_id=eq_send_unescape[2:6] #终端消息ID
                eq_mes_body=eq_send_unescape[6:10] #终端消息体属性
                eq_mes_number=eq_send_unescape[10:22] #终端手机号
                eq_mes_seq=eq_send_unescape[22:26] #终端消息流水号
                api_mes_seq = api_send_unescape[22:26]  # 抽取服务器发送的消息流水号
                api_mes_id=api_send_unescape[2:6] #抽取服务器发送的消息ID
                eq_mes_result=eq_send_unescape[-6:-4] #终端消息结果

                tem_list=[] #按顺序加入列表
                tem_list.append(eq_mes_id)
                tem_list.append(eq_mes_body)
                tem_list.append(eq_mes_number)
                tem_list.append(eq_mes_seq)
                tem_list.append(api_mes_seq)
                tem_list.append(api_mes_id)
                tem_list.append(eq_mes_result)

                send_data_end=v541_public.output_hex_packet_7e(data_list=tem_list) #获得转义后的重新编码的数据包
                eq_dict['tcp_class'].send(client=eq_dict['client'],data=send_data_end) #使用连接发送转换后的数据
                print('终端回复的数据为：',v541_public.unescape(hex_str=send_data_end))
                return str(api_send_unescape) #返回终端接收的数据
            else:
                return None

    @threads(3, timeout=60)
    def apiTask(self, api_dict):
        '''
        模拟saas平台，通过API下发指令；使用threads修饰，是为了实现多线程异步功能
        :param api_data:直接传入 OtherJson 的内容即可
        :return:
        '''
        start_time=time.time()
        end_time=time.time()
        while (end_time-start_time<60): #限定执行时长，防止陷入死循环
            if self.__flag == True:  # 当这个属性为True时，执行
                http_requests=HttpRequests()
                res=http_requests.send_request(api_dict)
                print('URL:',res.url)
                print('接口的返回值为：',res.json())
                return str(res.json()) #转换为字符串，否则无法从tomorrow对象中输出
            else:
                time.sleep(2)  # 当检测 self.__flag 不为True时，等待2秒，是为了不过多的占用系统资源
                end_time=time.time()


if __name__ == '__main__':
    pass
